package Persistencia;

import java.util.ArrayList;

import entidades.Log;
import entidades.LogConectividad;
import entidades.Mensaje;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;


public class CreadorBD extends SQLiteOpenHelper {

	// BASE DE DATOS
	static final String dbName = "pruebaDB";

	// TRIGERS
	static final String triger_broadcast = "Triger_Fecha_hora_Actuales_BroadCast";
	static final String triger_log = "Triger_Fecha_Hora_Actuales";
	static final String triger_mensaje="Triger_Fecha_Hora_Mensaje";
	static final String id = "_id";

	// Tabla con las acciones realizadas
	static final String tablaLog = "log_acciones";
	// columnas de la tabla Log
	static final String log_Id = "_id";
	static final String log_Accion = "tipo_accion";
	static final String log_Usuario = "nombre_usuario";
	static final String log_Fecha = "fecha";
	static final String log_Hora = "hora";

	// tabla mensajes
	static final String tablaMsj = "mensajes_servidor";
	// Columnas de la tabla con los mensajes servidor
	static final String mensajes_Id = "_id";
	static final String mensajes_Destinatario = "nombre_usuario"; // contiene el  id del 																	// contacto
																	// del
																	// servidor
	static final String mensajes_Fecha = "fecha";
	static final String mensajes_Hora = "hora";
	static final String mensajes_Texto = "texto";

	// tabla de conectividad
	static final String tablaConexion = "conexion";
	// Columnas de la tabla con los cambios de conexion
	static final String conexion_Id = "_id";
	static final String conexion_Tipo = "tipo";
	static final String conexion_Fecha = "fecha";
	static final String conexion_Hora = "hora";

	// tabla para asociar los contactos al servidor
	static final String tabla_Contacto_Servidor = "contacto_servidor";
	// Columnas
	static final String servidor_id_telefono = "id_telefono";
	static final String servidor_id_servidor = "id_servidor";

	private Context context;

	public CreadorBD(Context context) {
		super(context, dbName, null, 9);
		this.context = context;
	}

	/**
	 * @param db
	 *            de tipo SQLiteDatabase
	 */
	public void onCreate(SQLiteDatabase db) {

		db.execSQL("CREATE TABLE " + this.tablaLog + " ( " + this.id
				+ " INTEGER PRIMARY KEY AUTOINCREMENT," + this.log_Accion
				+ " VARCHAR(1), " + this.log_Usuario + " VARCHAR(30), "
				+ this.log_Fecha + " VARCHAR(30), " + this.log_Hora
				+ " VARCHAR(30))");

		db.execSQL("CREATE TABLE " + this.tablaMsj + " ( " + this.id
				+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + this.mensajes_Texto
				+ " VARCHAR(300), " + this.mensajes_Destinatario
				+ " VARCHAR(30), " + this.mensajes_Fecha + " VARCHAR(30), "
				+ this.mensajes_Hora + " VARCHAR(30))");
		db.execSQL("CREATE TRIGGER " + this.triger_log + " AFTER INSERT ON "
				+ this.tablaLog + " BEGIN  UPDATE " + this.tablaLog
				+ "  set fecha = date('now'), hora =time('now') "
				+ " where _id = new._id; END");

		db.execSQL("CREATE TABLE " + this.tablaConexion + " ( " + this.id
				+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + this.conexion_Tipo
				+ " VARCHAR(30), " + this.conexion_Fecha + " VARCHAR(30), "
				+ this.conexion_Hora + " VARCHAR(30))");
		db.execSQL("CREATE TRIGGER " + this.triger_broadcast
				+ " AFTER INSERT ON " + this.tablaConexion + " BEGIN  UPDATE "
				+ this.tablaConexion
				+ "  set fecha = date('now'), hora =time('now') "
				+ " where _id = new._id; END");
		
		db.execSQL("CREATE TABLE " + this.tabla_Contacto_Servidor + " ( "
				+ this.id + " INTEGER PRIMARY KEY AUTOINCREMENT, "
				+ this.servidor_id_telefono + " INTEGER, "
				+ this.servidor_id_servidor + " VARCHAR(50)) ");
		db.execSQL("CREATE TRIGGER " + this.triger_mensaje
				+ " AFTER INSERT ON " + this.tablaMsj + " BEGIN  UPDATE "
				+ this.tablaMsj
				+ "  set fecha = date('now'), hora =time('now') "
				+ " where _id = new._id; END");

	}

	public void onUpgrade(SQLiteDatabase db, int v, int n) {
		db.execSQL("DROP TABLE IF EXISTS " + this.tablaLog);
		db.execSQL("DROP TABLE IF EXISTS " + this.tablaMsj);
		db.execSQL("DROP TRIGGER IF EXISTS " + this.triger_log);
		db.execSQL("DROP TABLE IF EXISTS " + this.tablaConexion);
		db.execSQL("DROP TRIGGER IF EXISTS " + this.triger_broadcast);
		db.execSQL("DROP TABLE IF EXISTS " + this.tabla_Contacto_Servidor);
		db.execSQL("DROP TRIGGER IF EXISTS " + this.triger_mensaje);
		this.onCreate(db);
	}

	/**
	 * Metodo para validar si un contacto ya esta asociado al servidor
	 * 
	 * @param id
	 *            del tipo string representa el id del contacto
	 * @return boolean que indica si lo esta o no
	 */
	public boolean estaAsociado(String id) {
		boolean resp = false;
		SQLiteDatabase db = this.getReadableDatabase();
		Cursor cur = db.rawQuery("Select * from "
				+ this.tabla_Contacto_Servidor + " where "
				+ this.servidor_id_telefono + " = ?", new String[] { id });
		if (cur.moveToNext()) {
			
			resp= true;
		} else {
			
			resp= false;
		}
		cur.close();
		db.close();
		return resp;
	}

	/**
	 * Metodo para asociar un contacto a un usuario del servidor
	 * 
	 * @param, id del tipo string que representa el id del contacto en el
	 *         telfono usuario del tipo string que representa el usuairo en el
	 *         servidor del contacto
	 * @return boolean que indica el exito d ela insercion
	 * 
	 */
	public boolean asociarContacto(String id, String usuario) {
		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues nuevoRegistro = new ContentValues();
		nuevoRegistro.put(this.servidor_id_telefono, id);
		nuevoRegistro.put(this.servidor_id_servidor, usuario);

		db.insert(this.tabla_Contacto_Servidor, null, nuevoRegistro);
		db.close();
		return true;
	}

	/**
	 * Metodo encargado de la insercion de un registro en la tabla Log (registra
	 * acciones)
	 * 
	 * @param l
	 *            de tipo Log, contiene la acción y el usuario con el que se
	 *            efectuó
	 * @return boolean que indica el éxito de la inserción
	 */
	public boolean insertarNuevaAccion(Log l) {
		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues nuevoRegistro = new ContentValues();
		nuevoRegistro.put(this.log_Usuario, l.getUsuario().toLowerCase());
		nuevoRegistro.put(this.log_Accion, l.getAccion());

		db.insert(this.tablaLog, null, nuevoRegistro);
		db.close();
		return true;

	}

	/**
	 * Metodo encargado de la insercion de un registro en la tabla Conexion
	 * 
	 * @param tipoConexion
	 *            de tipo int, es el tipo de conexion que cambió
	 * @return boolean que indica el éxito en el insert
	 */
	public boolean insertarNuevaConexion(int tipoConexion) {
		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues nuevoRegistro = new ContentValues();
		nuevoRegistro.put(this.conexion_Tipo, tipoConexion);

		db.insert(this.tablaConexion, null, nuevoRegistro);
		db.close();
		return true;

	}

	/**
	 * Metodo encargado de la inserci{on de un mensaje en la BD
	 * 
	 * @param id
	 *            del tipo string que representa el id del contacto en el
	 *            telefono msj del tipo Mensaje que contiene los datos referidos
	 *            al mensaje (detinatario, fecha y hora, texto)
	 * @return boolean que indica el exito d ela insercion
	 * 
	 */
	public boolean insertarMensaje(Mensaje msj) {
		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues nuevoRegistro = new ContentValues();
		nuevoRegistro.put(this.mensajes_Destinatario, msj.getDestinatario());
		nuevoRegistro.put(this.mensajes_Texto, msj.getMensaje());

		db.insert(this.tablaMsj, null, nuevoRegistro);
		db.close();
		return true;
	}

	// esto deberiamso de ver de traer solo las ultimas xx porque a medida que
	// crezca puede cosumir mucho
	public ArrayList<Log> obtenerAcciones(String faccion, String fusuario,
			String ffecha) {
		String selection = " 1=1 and " + this.log_Usuario + " like ? ";
		if (faccion.equals("")) {
			faccion = this.log_Accion;
			selection += " and '" + this.log_Accion + "' = ? ";// si la accion
																// es nulla creo
     															// un 1=1 pero
																// con strings

		} else {
			selection += " and " + this.log_Accion + " = ? ";
		}
		if (ffecha.equals("")) {
			ffecha = this.log_Fecha;
			selection += " and '" + this.log_Fecha + "' = ? ";
		} else {
			selection += " and " + this.log_Fecha + " = ? ";
		}
		ArrayList<Log> listaLogs = new ArrayList<Log>();
		Cursor cur;
		SQLiteDatabase db = this.getReadableDatabase();
		cur = db.query(this.tablaLog, null, selection, new String[] { fusuario,
				faccion, ffecha }, null, null, null);
		
		while (cur.moveToNext()) {
			Log logADevolver = new Log();
			logADevolver.setId(cur.getInt(cur.getColumnIndex("_id")));
			logADevolver.setUsuario(cur.getString(cur
					.getColumnIndex("nombre_usuario")));
			logADevolver.setAccion(cur.getString(cur
					.getColumnIndex("tipo_accion")));
			logADevolver.setFecha(cur.getString(cur.getColumnIndex("fecha")));
			logADevolver.setHora(cur.getString(cur.getColumnIndex("hora")));
			listaLogs.add(logADevolver);
		}
		cur.close();
		db.close();
		return listaLogs;
	}

	/**
	 * Metodo para traer todos los registros de conectividad guardados
	 */
	// esto deberiamso de ver de traer solo las ultimas xx porque a medida que
	// crezca puede cosumir mucho
	public ArrayList<LogConectividad> obtenerRegistroConexion() {
		ArrayList<LogConectividad> listaLogs = new ArrayList<LogConectividad>();

		SQLiteDatabase db = this.getReadableDatabase();
		Cursor cur = db.rawQuery("Select * from " + this.tablaConexion, null);
		
		while (cur.moveToNext()) {
			LogConectividad logADevolver = new LogConectividad();
			logADevolver.setId(cur.getInt(cur.getColumnIndex("_id")));
			logADevolver.setTipo(Integer.parseInt(cur.getString(cur
					.getColumnIndex("tipo"))));
			logADevolver.setFecha(cur.getString(cur.getColumnIndex("fecha")));
			logADevolver.setHora(cur.getString(cur.getColumnIndex("hora")));
			listaLogs.add(logADevolver);

		}
		cur.close();
		db.close();
		return listaLogs;

	}

	/**
	 * Con esto obtenemos el nombre del usuario de servidor, destinatario del
	 * msj
	 * 
	 */
	public String obtenerUsuarioDestino(String id) {
		String nombreServidor = "";
		SQLiteDatabase db = this.getReadableDatabase();
		Cursor cur = db.query(this.tabla_Contacto_Servidor,
				new String[] { this.servidor_id_servidor },
				this.servidor_id_telefono + " =? ", new String[] { id }, null,
				null, null);
		if (cur.moveToNext()) {
			nombreServidor = cur.getString(0);
		}
		cur.close();
		db.close();
		return nombreServidor;
	}
	
	public ArrayList<Mensaje> getUserServerMessages(String destinatario_servidor){
		ArrayList<Mensaje> listaMensajes=new ArrayList();
		
		SQLiteDatabase db = this.getReadableDatabase();
		Cursor cur = db.query(this.tablaMsj, null, this.mensajes_Destinatario+" =? ", 
				new String[]{destinatario_servidor}, null, null, null);
		
		while (cur.moveToNext()) {
			Mensaje mensaje=new Mensaje();
			mensaje.setDestinatario(cur.getString(cur.getColumnIndex(this.mensajes_Destinatario)));
			mensaje.setFecha(cur.getString(cur
					.getColumnIndex(this.mensajes_Fecha)));
			mensaje.setHora(cur.getString(cur.getColumnIndex(this.mensajes_Hora)));
			mensaje.setMensaje(cur.getString(cur.getColumnIndex(this.mensajes_Texto)));
			listaMensajes.add(mensaje);

		}
		cur.close();
		db.close();
		return listaMensajes;

	}
	
	
}